package main

import (
	"context"
	"fmt"
	"sync"
	"time"
)

// 为什么需要context?

var wg sync.WaitGroup

func f(cancel context.Context) {
	defer wg.Done()
	//LOOP:
	for true { // 死循环,一直不会退出
		fmt.Println("二狗")
		time.Sleep(time.Millisecond * 500)
		select {
		case <-cancel.Done():
			return
		default:
			fmt.Println("--------------------------")
		}
	}
}
func main() {
	cancel, cancelFunc := context.WithCancel(context.Background())
	wg.Add(1)
	go f(cancel)
	// 模拟其他逻辑程序
	time.Sleep(time.Second * 3)
	// 3秒后, 调用 cancelFunc(), 就会满足条件 <-cancel.Done()
	cancelFunc()
	wg.Wait()	// 等待 f()执行结束
	fmt.Println("over~")
}
